home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asm_msc1.arc / EX513.ASM < prev    next >
Assembly Source File  |  1988-11-20  |  2KB  |  64 lines

  1. TITLE  Sort a Telephone List (EX513.ASM)
  2.           PAGE      ,132
  3. DATA      SEGMENT   PARA 'DATA'
  4. SAVE_CNT  DW        ?
  5. FIRST_ENT   DW      ?
  6. DATA      ENDS
  7. OUR_CODE  SEGMENT   PARA 'CODE'
  8.       PUBLIC    PHONE_NOS
  9. PHONE_NOS PROC      FAR
  10.           ASSUME    CS:OUR_CODE,DS:DATA
  11.       PUSH        AX             ;Save scratch registers
  12.       PUSH        BX
  13.       PUSH        CX
  14.       PUSH        BP
  15.       PUSH        DI
  16.       PUSH        SI
  17.       PUSH        DS
  18. ;
  19. ;  Initialize DS.
  20. ;
  21.       MOV        AX,SEG DATA
  22.       MOV        DS,AX
  23.       CLD                 ;Set DF = 0, to move forward
  24.       MOV        CX,ES:[DI]         ;Fetch entry count
  25.       MOV        SAVE_CNT,CX         ;Save this value in memory
  26.       ADD        DI,2         ;Get address of first entry
  27.       MOV        FIRST_ENT,DI     ; and save this address
  28. INIT:      MOV        BX,1         ;Exchange flag (BX) = 1
  29.       DEC        SAVE_CNT         ;Get ready for count-1 compares
  30.       JZ        SORTED         ;Exit if SAVE_CNT is 0
  31.       MOV        CX,SAVE_CNT      ;Load compare count into CX
  32.       MOV        BP,FIRST_ENT     ; and first entry addr. into BP
  33. NEXT:      MOV        DI,BP         ;Address one entry with DI
  34.       MOV        SI,BP         ; and the next entry with SI
  35.       ADD        SI,42
  36.       PUSH        CX              ;Save current compare count
  37.       MOV        CX,15         ;Compare 15-byte surnames
  38. REPE      CMPS      ES:BYTE PTR[SI],ES:[DI]  
  39.                      ;Is next surname < this surname?
  40.       JAE        CONT         ; No.  Go check next pair
  41.       MOV        CX,42         ; Yes.  Exchange these entries
  42. SWAPEM:   MOV        AL,ES:[BP]
  43.       XCHG        ES:[BP+42],AL
  44.       MOV        ES:[BP],AL
  45.       INC        BP
  46.       LOOP        SWAPEM
  47.       SUB        BX,BX         ;Set exchange flag = 0
  48. CONT:      POP        CX             ;Reload compare count
  49.       ADD        BP,42         ;Point to next entry
  50.       LOOP        NEXT         ; and go compare next two names
  51.       CMP        BX,0         ;Were any exchanges made?
  52.       JE        INIT         ; If so, make another pass
  53. SORTED:      POP        DS
  54.       POP        SI
  55.       POP        DI
  56.       POP        BP
  57.       POP        CX
  58.       POP        BX
  59.       POP        AX
  60.       RET                 ;  and exit.
  61. PHONE_NOS ENDP
  62. OUR_CODE  ENDS
  63.          END       PHONE_NOS
  64.